import { glyphsUrl, spriteUrl } from "../../mapbox_config/mapConfigManager/index";
import { connectMap, onMapEvent } from "@/mapbox/mapbox_tool/eventManage/index";
import { eventBus } from "@/mapbox/mapbox_tool/EventBus/index";
// 导出一个函数，用于获取地图样式
export const getMapStyleMgr = (TileUrl: string) => {
  console.log(glyphsUrl);

  // 定义地图样式
  const mapStyle = {
    version: 8, // 版本号
    sources: {
      "osm-tiles": {
        type: "raster", // 类型为栅格
        tiles: [TileUrl] // 地图瓦片地址
      }
    },
    glyphs: glyphsUrl, //字体
    sprite: spriteUrl, //雪碧图
    layers: [
      {
        id: "osm-tiles", // 图层id
        type: "raster", // 类型为栅格
        source: "osm-tiles" // 数据源
      }
    ]
  };
  // 返回地图样式
  return mapStyle;
};

// 导出一个函数，用于改变地图样式。本地地图样式
export const changeMapStyleMgr = (map: any, TileUrl: string) => {
  // 记录原样式中的 sources 和 layers
  const { originalSources, originalLayers } = originalStyleMgr(map);

  // 获取地图样式
  const mapStyle = getMapStyleMgr(TileUrl);
  // 设置地图样式
  map.setStyle(mapStyle);

  // 恢复地图样式
  restoreMapStyleMgr(map, originalSources, originalLayers);
};

// 导出一个函数，用于自定义地图样式
export const customMapStyleMgr = (map: any, TileUrl: string) => {
  // 获取地图样式
  const mapStyle = getMapStyleMgr(TileUrl);
  // 设置地图样式
  map.setStyle(mapStyle);
};

// 记录原样式中的 sources 和 layers ， 用于恢复地图样式
export const originalStyleMgr = (map: any) => {
  // 记录原样式中的 sources 和 layers
  const originalStyle = map.getStyle();
  const originalSources = originalStyle.sources;
  const originalLayers = originalStyle.layers;
  return { originalSources, originalLayers };
};

// 恢复地图样式
export const restoreMapStyleMgr = (map: any, originalSources: any, originalLayers: any) => {
  // 监听 styledata 事件
  map.on("styledata", () => {
    if (map.isStyleLoaded()) {
      // 添加原有的 sources
      for (const sourceId in originalSources) {
        if (!map.getSource(sourceId)) {
          map.addSource(sourceId, originalSources[sourceId]);
        }
      }
      // 添加原有的 layers
      originalLayers.forEach((layer: any) => {
        if (!map.getLayer(layer.id)) {
          try {
            map.addLayer(layer);
          } catch (error) {
            console.error(`添加图层 ${layer.id} 时出错:`, error);
          }
        }
      });

      // 移除事件监听器
      map.off("styledata");
    }
  });
};

// 导出一个函数removeMap，用于移除传入的map
export const removeMapMgr = (map: any) => {
  // 调用map的remove方法，移除map
  map.remove();
};

// 初始化地图拖拽和缩放处理
export const initMapDragZoomMgr = (map: any) => {
  connectMap(map);

  const handleMoveEnd = () => {
    if (map) {
      const bounds = map.getBounds();
      const zoom = map.getZoom();

      // 触发自定义事件或执行其他操作
      console.log("地图视图变化:", { zoom, bounds });

      // 触发自定义事件通知其他组件
      eventBus.dispatchEvent("mapViewChange", { zoom, bounds });
    }
  };

  onMapEvent("moveend", handleMoveEnd);
  onMapEvent("zoomend", handleMoveEnd);
};


// 地形加载处理
export const terrainMgrAdd = (map: any, id: string, tilesUrl: string, exaggeration: number = 0.01) => {
  const TERRAIN_SOURCE_ID = id + "terrain-source"
  const source = map.getSource(TERRAIN_SOURCE_ID);
  if (!source) {
    map.addSource(TERRAIN_SOURCE_ID, {
      type: "raster-dem",
      tiles: [tilesUrl],
      tileSize: 512
    });
  }
  // 启用地形渲染
  map.setTerrain({ source: TERRAIN_SOURCE_ID, exaggeration });
}

// 地形移除处理
export const removeTerrainMgr = (map: any, id: string) => {
  if (!map.loaded()) {
    throw new Error('地图尚未加载完成，无法移除地形');
  }
  map.setTerrain(null);
  const TERRAIN_SOURCE_ID = id + "terrain-source"
  // 移除地形数据源
  if (map.getSource(TERRAIN_SOURCE_ID)) {
    map.removeSource(TERRAIN_SOURCE_ID);
  }
}
